var express = require('express'),
  // superagent = require('superagent'),
  session = require('express-session'),
  glob = require('glob'),
  // favicon = require('serve-favicon'),
  logger = require('morgan'),
  cookieParser = require('cookie-parser'),
  bodyParser = require('body-parser'),
  compress = require('compression'),
  methodOverride = require('method-override'),
  swig = require('swig-templates');
  // basicAuth = require("basic-auth");
// common = require('../app/controllers/base/common.js');

// swig.setFilter('dump', function(input) {
//   return console.log(input);
// });

// swig.setDefaults({ cache: 'memory' });

/*
var auth = function (req, resp, next) {
    function unauthorized(res) {
        res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
        return resp.sendStatus(401);
    }

    var user = basicAuth(req);

    if (!user || !user.name || !user.pass) {
        return unauthorized(resp);
    }

    if (user.name === 'leisutiyu' && user.pass === 'leisutiyu666') {
        return next();
    } else {
        return unauthorized(resp);
    }
};
*/

module.exports = function(app, config) {
  var env = process.env.NODE_ENV || 'development';
  app.locals.ENV = env;
  app.locals.ENV_DEVELOPMENT = env == 'development';

  app.engine('html', swig.renderFile);
  if (env == 'development') {
    app.set('view cache', false);
    swig.setDefaults({ cache: false });
  }

  // gulp 操作之前的设置
  app.set('views', config.root + '/app/views');

  // gulp 操作之后的设置
  // app.set('views', config.root + '/pages/views');

  app.set('view engine', 'html');

  app.use(logger('dev'));
  //app.set('trust proxy', 1) // trust first proxy
  app.use(session({
    secret: 'keyboard cat',
    resave: true,
    saveUninitialized: true,
    cookie: {
      maxAge: 2 * 24 * 60 * 60 * 1000 // 48 hours
    }
  }));
  app.use(bodyParser.json());
  app.use(bodyParser.urlencoded({
    extended: true
  }));
  app.use(cookieParser());
  app.use(compress());
  app.use(express.static(config.root + '/asset', {
    maxAge: config.options.maxAge
  }));
  app.use(methodOverride());

  var controllers = glob.sync(config.root + '/app/controllers/*.js');
  controllers.forEach(function(controller) {
    require(controller)(app);
  });

  // 用户访问页面必须有cookie，这里统一处理没有cookie时怎么处理？
  // 能执行这里，肯定是没有cookie的；直接清理cookie，也可以不清理，最好是清理下，确保没有问题；
  // 后来发现不能这么做，因为访问所有路由都有可能执行这里；一旦执行这里下面的404等就永远无法执行到了；
  // app.use(function(req, res, next) {
  //   res.clearCookie('user_id');
  //   // res.redirect("/");
  //   res.send('哈哈，没有cookie：user_id');
  // });

  // 如果前面的进行了 send、end、json、render等操作，就不会执行这里；
  // 一旦执行这里就说明之前没有执行那些方法，那就意味着访问的url不在项目的处理范围内；
  app.use(function(req, res, next) {
    var err = new Error('Error Page');
    err.status = 404;
    next(err);
  });

  // basic auth
  // 为什么会在这里进行验证？
  /*
  app.get('*', auth, function (req, resp, next) {
    next()
  });
  */

  // console.log(app.get('env')); // 正确得到结果；

  if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
      res.status(err.status || 500);
      res.render('error', {
        message: err.message,
        error: err,
        title: '错误',
        keywords: '篮球比分,篮球比分直播,篮球即时比分',
        description: '看篮球比分直播上雷速篮球比分，为您提供全网最全最快篮球比分直播，同时为您提供最详细的篮球比分赛程、篮球完场比分、篮球即时比分等数据服务，篮球比分直播涵盖世界范围联赛，例如NBA、CBA、欧洲篮球比分的精准权威比分直播服务'
      });
      // res.write(err)
    });
  } else {
    app.use(function(err, req, res, next) {
      console.error(err.stack);
      // res.type('text/plain'); 响应头 Content-Type；
      // res.status(500); 响应状态码；
      // res.send('500 - Server Error'); 响应体；
      
      res.status(err.status || 500);
      res.render('error', {
        message: err.message,
        error: {},
        title: '错误',
        keywords: '篮球比分,篮球比分直播,篮球即时比分',
        description: '看篮球比分直播上雷速篮球比分，为您提供全网最全最快篮球比分直播，同时为您提供最详细的篮球比分赛程、篮球完场比分、篮球即时比分等数据服务，篮球比分直播涵盖世界范围联赛，例如NBA、CBA、欧洲篮球比分的精准权威比分直播服务'
      });
      // res.write(err)
    });
  }
};